﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace Servico
{
    public class Pedido
    {
        private int id_pedido_recebido;
        private int id_pedido;
        private int id_cliente;
        private DateTime data_entrada_pedido;
        private int prioridade;
        private bool alocado;
        private bool pronto;
        private Dictionary<int, Tarefa> tarefas;

        public Pedido()
        {
            this.id_pedido_recebido = 0;
            this.id_pedido = 0;
            this.id_cliente = 0;
            this.data_entrada_pedido = DateTime.Now;
            this.prioridade = 0;
            this.alocado = false;
            this.pronto = false;
            this.tarefas = new Dictionary<int, Tarefa>();

        }

        public Pedido(int i, int it, int ic, DateTime d, int p, bool a, bool pr, Dictionary<int, Tarefa> tar)
        {
            this.id_pedido_recebido = i;
            this.id_pedido = it;
            this.id_cliente = ic;
            this.data_entrada_pedido = d;
            this.prioridade = p;
            this.alocado = a;
            this.pronto = pr;
            this.tarefas = tar;

        }

        public int getId_pedido_recebido() { return this.id_pedido_recebido; }
        public int getId_pedido() { return this.id_pedido; }
        public int getId_cliente() { return this.id_cliente; }
        public DateTime getData_entrada_pedido() { return this.data_entrada_pedido; }
        public int getPrioridade() { return this.prioridade; }
        public bool getAlocado() { return this.alocado; }
        public bool getPronto() { return this.pronto; }
        public Dictionary<int, Tarefa> getTarefas(){
            Dictionary<int, Tarefa> res = new Dictionary<int, Tarefa>();
            foreach (Tarefa t in tarefas.Values)
            {
                res.Add(t.getId(), t);
            }
            return res;
        }

        public void setId_pedido_recebido(int s) { this.id_pedido_recebido = s; }
        public void setId_pedido(int s) { this.id_pedido = s; }
        public void setId_cliente(int s) { this.id_cliente = s; }
        public void setData_entrada_pedido(DateTime s) { this.data_entrada_pedido = s; }
        public void setPrioridade(int s) { this.prioridade = s; }
        public void setAlocado(bool s) { this.alocado = s; }
        public void setPronto(bool s) { this.pronto = s; }
        public void setTarefas( Dictionary<int,Tarefa> ta){
          foreach(Tarefa t in ta.Values){
               this.tarefas.Add(t.getId(), t);
            }
        }

        public void destroyTarefas()
        {
            tarefas.Clear();
        }

        //ADICIONAR ESTE METODO AO VPP (É PRECISO PARA SABER A DURACAO DE CADA PEDIDO)
        public int duracaoPedido()
        {
            int total = 0;
            foreach (Tarefa t in tarefas.Values)
            {
                total += t.getDuracao();
            }
            return total;
        }

        public int getNumTarefas()
        {
            int numTarefas = 0;
            foreach (Tarefa tarefa in tarefas.Values)
            {
                numTarefas++;
            }
            return numTarefas;
        }


        public DateTime getInicioPedido (int id_tarefa, int id_pedido_recebido, Dictionary<int, Tecnico> tecnicos)
        {
            Dictionary<DateTime, Tarefa> aux;
            Tarefa tarefa = tarefas[id_tarefa];
            DateTime hora = DateTime.Now;
            
            foreach (Tecnico tecnico in tecnicos.Values)
            {
                aux = tecnico.getPlaneamento();
                foreach (DateTime date in aux.Keys)
                {
                    if (aux[date].getId_pedido_recebido() == id_pedido_recebido)
                    {
                        if (id_tarefa < tarefa.getId()) tarefa = aux[date];
                        hora = date;
                    }
                }
            }
            return hora;
        }

        public DateTime getFimPedido(int id_tarefa, int id_pedido_recebido, Dictionary<int, Tecnico> tecnicos, Dictionary<int, Pedido> pedidos)
        {
            int num_tarefas_prontas = 0;

            foreach (Pedido pedido in pedidos.Values)
            {
                if (pedido.getId_pedido_recebido() == id_pedido_recebido)
                {
                    foreach (Tarefa tarefa in pedido.getTarefas().Values)
                    {
                        if (tarefa.getPronta()) num_tarefas_prontas++;
                    }
                }
            }

            int duracao = pedidos[id_pedido_recebido].duracaoPedido() - num_tarefas_prontas;
            return getInicioPedido(id_tarefa, id_pedido_recebido, tecnicos).AddHours(duracao);
        }

    }
}